//
//  CPJComposeTextView.swift
//  Sina
//
//  Created by YYY on 2017/9/4.
//  Copyright © 2017年 成品家（北京）网路科技有限公司. All rights reserved.
//

import UIKit

/*
 通知：一对多，通知是发生事件时，将通知发送给通知中心，由通知中心广播通知。
      执行效率相对较低
 
 代理：一对一，代理是发生事件时，直接让代理执行协议方法。
      执行效率高，常用于直接的反向传值
 
 如果层次嵌套较深，可以使用通知传值
 */
class CPJComposeTextView: UITextView {
    
    //占位符label
    fileprivate lazy var placeholderLabel = UILabel()
    
    override func awakeFromNib() {
        //设置占位标签
        setupUI()
    }

    //监听方法
    @objc fileprivate func textViewChanged()
    {
        //如果有文本就隐藏占位文本，否则就显示
        placeholderLabel.isHidden = hasText
    }
    
    //注销通知
    deinit {
        NotificationCenter.default.removeObserver(self)
    }
}

// MARK：表情键盘专属
extension CPJComposeTextView
{
    var emoticonText: String?
    {
        //获取textview的属性文本
        guard let attriText = attributedText else
        {
            return ""
        }
        
        var result = String()
        
        //需要获的属性文本中的图片
        //遍历的范围、遍历的选项、闭包
        attriText.enumerateAttributes(in: NSRange(location: 0, length: attriText.length), options: []) { (dict, range, _) in
            
            print(dict)
            print(range)
            
            if let attachment = dict["NSAttachment"] as? EmoticonAttachment
            {
                result += attachment.chs ?? ""
                //图片文本
                print(attachment)
            }
            else
            {
                //纯文本
                let subString = (attriText.string as NSString).substring(with: range)
                result += subString
            }
            
        }
        
        print(result)
        return attriText.string
    }
    func insertEmoticonModel(model: CPJEmoticonModel?)
    {
        guard let emoticonModel = model else
        {
            //删除文本按钮
            deleteBackward()
            return
        }
        
        //emoji表情按钮
        if let emoji = emoticonModel.emoji,
            let textRange = selectedTextRange
        {
            replace(textRange, withText: emoji)
            return
        }
        
        //获取表情中的图像属性文本
        let imageText = emoticonModel.imageText(font: font!)
        //获取textView的可变属性文本
        let attributeText = NSMutableAttributedString(attributedString: attributedText)
        //将图像的属性文本，插入光标的当前位置
        attributeText.replaceCharacters(in: selectedRange, with: imageText)
        
        //记录光标位置
        let range = selectedRange
        
        //重新设置属性文本
        attributedText = attributeText
        
        //恢复光标位置
        selectedRange = NSRange(location: range.location + 1, length: 0)
        
        delegate?.textViewDidChange?(self)
        textViewChanged()
    }
}

private extension CPJComposeTextView
{
    func setupUI()
    {
        //注册监听通知
        NotificationCenter.default.addObserver(self, selector: #selector(textViewChanged), name: NSNotification.Name.UITextViewTextDidChange, object: nil)
        
        //设置占位标签
        placeholderLabel.text = "分享新鲜事..."
        placeholderLabel.font = self.font
        placeholderLabel.textColor = UIColor.lightGray
        placeholderLabel.sizeToFit()
        addSubview(placeholderLabel)
        
        //坐标位置
        placeholderLabel.frame.origin = CGPoint(x: 5, y: 8)
    }
}
